<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>任务管理 - FreeRTOS学习笔记</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            line-height: 1.6;
            color: #333;
            background-color: #f4f4f4;
        }

        header {
            background: linear-gradient(135deg, #2c3e50, #3498db);
            color: white;
            text-align: center;
            padding: 2rem 0;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }

        h1 {
            font-size: 2.5rem;
            margin-bottom: 0.5rem;
        }

        .subtitle {
            font-size: 1.2rem;
            opacity: 0.9;
        }

        nav {
            background-color: #2c3e50;
            padding: 0;
            position: sticky;
            top: 0;
            z-index: 100;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }

        nav ul {
            list-style: none;
            display: flex;
            justify-content: center;
            flex-wrap: wrap;
        }

        nav li {
            margin: 0;
        }

        nav a {
            display: block;
            color: white;
            text-decoration: none;
            padding: 1rem 1.5rem;
            transition: background-color 0.3s;
        }

        nav a:hover {
            background-color: #3498db;
        }

        .container {
            max-width: 1200px;
            margin: 2rem auto;
            padding: 0 2rem;
        }

        .content {
            background-color: white;
            border-radius: 8px;
            padding: 2rem;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }

        section {
            margin-bottom: 3rem;
        }

        h2 {
            color: #2c3e50;
            border-bottom: 2px solid #3498db;
            padding-bottom: 0.5rem;
            margin-bottom: 1.5rem;
        }

        h3 {
            color: #3498db;
            margin: 1.5rem 0 1rem;
        }

        h4 {
            color: #2c3e50;
            margin: 1rem 0 0.5rem;
        }

        p {
            margin-bottom: 1rem;
        }

        ul, ol {
            margin-left: 2rem;
            margin-bottom: 1rem;
        }

        li {
            margin-bottom: 0.5rem;
        }

        pre {
            background-color: #f8f9fa;
            border: 1px solid #e9ecef;
            border-radius: 4px;
            padding: 1rem;
            overflow-x: auto;
            margin: 1rem 0;
        }

        code {
            font-family: 'Courier New', monospace;
            background-color: #f8f9fa;
            padding: 0.2rem 0.4rem;
            border-radius: 3px;
            font-size: 0.9rem;
        }

        pre code {
            background-color: transparent;
            padding: 0;
        }

        .function-signature {
            background-color: #e8f4fc;
            border-left: 4px solid #3498db;
            padding: 1rem;
            margin: 1rem 0;
            border-radius: 0 4px 4px 0;
        }

        .footer {
            text-align: center;
            padding: 2rem;
            background-color: #2c3e50;
            color: white;
            margin-top: 2rem;
        }

        .nav-links {
            display: flex;
            justify-content: space-between;
            margin-top: 2rem;
        }

        .nav-links a {
            text-decoration: none;
            color: #3498db;
            font-weight: bold;
            padding: 0.5rem 1rem;
            border: 1px solid #3498db;
            border-radius: 4px;
        }

        .nav-links a:hover {
            background-color: #3498db;
            color: white;
        }

        @media (max-width: 768px) {
            nav ul {
                flex-direction: column;
            }

            .container {
                padding: 0 1rem;
            }

            h1 {
                font-size: 2rem;
            }
        }
    </style>
    <!-- 引入浮动笔记窗口脚本 -->
    <script src="float-notes.js"></script>
</head>
<body>
    <header>
        <h1>FreeRTOS学习笔记</h1>
        <p class="subtitle">第二章：任务管理</p>
    </header>

    <nav>
        <ul>
            <li><a href="index.html">主页</a></li>
            <li><a href="chapter1.html">基础知识</a></li>
            <li><a href="chapter2.html">任务管理</a></li>
            <li><a href="chapter3.html">任务调度</a></li>
            <li><a href="chapter4.html">内存管理</a></li>
            <li><a href="chapter5.html">队列</a></li>
            <li><a href="chapter6.html">信号量</a></li>
            <li><a href="chapter7.html">软件定时器</a></li>
            <li><a href="image_gallery.html">图片资源</a></li>
        </ul>
    </nav>

    <div class="container">
        <div class="content">
            <section id="task-management">
                <h2>2. 任务管理</h2>
                
                <h3>2.1 任务创建</h3>
                
                <h4>动态创建</h4>
                <p>动态创建任务由FreeRTOS自动分配所需内存：</p>
                <ul>
                    <li>任务控制块(TCB)和任务栈从FreeRTOS堆中分配</li>
                    <li>使用简单，但可能存在内存分配失败的风险</li>
                    <li>适用于大多数应用场景</li>
                </ul>
                
                <h4>静态创建</h4>
                <p>静态创建需要用户预先分配内存：</p>
                <ul>
                    <li>用户需要提供任务控制块和任务栈的内存空间</li>
                    <li>保证内存分配成功，适用于对可靠性要求高的场景</li>
                    <li>可以将任务栈放置在特定的内存区域</li>
                </ul>
                
                <h3>2.2 任务控制块(TCB)</h3>
                <p>任务控制块是任务的核心数据结构，包含以下重要成员：</p>
                <ul>
                    <li><strong>pxTopOfStack</strong>: 任务栈顶指针，任务切换的关键</li>
                    <li><strong>xStateListItem</strong>: 任务状态列表项，用于将任务链接到不同状态列表</li>
                    <li><strong>xEventListItem</strong>: 事件列表项，用于事件同步</li>
                    <li><strong>uxPriority</strong>: 任务优先级</li>
                    <li><strong>pcTaskName</strong>: 任务名称</li>
                </ul>
                
                <h3>2.3 任务删除</h3>
                <p>任务删除涉及多个步骤：</p>
                <ul>
                    <li>从当前所在状态列表中移除任务</li>
                    <li>如果删除自身，则加入删除挂起列表，由空闲任务清理</li>
                    <li>如果删除其他任务，则直接释放内存</li>
                    <li>需要注意用户分配的内存需要在删除前释放</li>
                </ul>
                
                <h3>2.4 任务相关函数详解</h3>
                
                <h4>xTaskCreate - 动态创建任务</h4>
                <div class="function-signature">
                    <pre><code>BaseType_t xTaskCreate(
    TaskFunction_t pvTaskCode,      // 任务函数指针
    const char * const pcName,      // 任务名称
    configSTACK_DEPTH_TYPE usStackDepth, // 任务栈深度（字）
    void *pvParameters,             // 传递给任务函数的参数
    UBaseType_t uxPriority,         // 任务优先级
    TaskHandle_t *pxCreatedTask     // 任务句柄指针（可为NULL）
);</code></pre>
                </div>
                
                <p><strong>返回值</strong>：</p>
                <ul>
                    <li>pdPASS: 任务创建成功</li>
                    <li>errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: 内存分配失败</li>
                </ul>
                
                <p><strong>作用</strong>：动态创建一个任务，包括分配任务控制块和栈空间</p>
                
                <p><strong>示例</strong>：</p>
                <pre><code>// 定义任务函数
void vTaskFunction(void *pvParameters) {
    // 任务代码
    for (;;) {
        // 执行任务功能
        vTaskDelay(pdMS_TO_TICKS(1000)); // 延时1秒
    }
}

// 创建任务
TaskHandle_t xTaskHandle;
BaseType_t xReturned = xTaskCreate(
    vTaskFunction,           // 任务函数
    "MyTask",                // 任务名称
    128,                     // 栈深度128字
    NULL,                    // 无参数
    1,                       // 优先级1
    &xTaskHandle             // 任务句柄
);

if (xReturned != pdPASS) {
    // 任务创建失败处理
}</code></pre>
                
                <h4>xTaskCreateStatic - 静态创建任务</h4>
                <div class="function-signature">
                    <pre><code>TaskHandle_t xTaskCreateStatic(
    TaskFunction_t pxTaskCode,      // 任务函数指针
    const char * const pcName,      // 任务名称
    const uint32_t ulStackDepth,    // 任务栈深度（字）
    void * const pvParameters,      // 传递给任务函数的参数
    UBaseType_t uxPriority,         // 任务优先级
    StackType_t * const puxStackBuffer, // 任务栈缓冲区指针
    StaticTask_t * const pxTaskBuffer   // 任务控制块缓冲区指针
);</code></pre>
                </div>
                
                <p><strong>返回值</strong>：任务句柄，如果创建失败则返回NULL</p>
                <p><strong>作用</strong>：静态创建一个任务，使用用户提供的内存空间</p>
                
                <p><strong>示例</strong>：</p>
                <pre><code>// 定义任务栈和任务控制块
static StaticTask_t xTaskBuffer;
static StackType_t xStack[128];

// 定义任务函数
void vTaskFunction(void *pvParameters) {
    for (;;) {
        // 执行任务功能
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

// 创建静态任务
TaskHandle_t xTaskHandle = xTaskCreateStatic(
    vTaskFunction,           // 任务函数
    "MyStaticTask",          // 任务名称
    128,                     // 栈深度
    NULL,                    // 无参数
    1,                       // 优先级
    xStack,                  // 栈缓冲区
    &xTaskBuffer             // 任务控制块缓冲区
);</code></pre>
                
                <h4>vTaskDelete - 删除任务</h4>
                <div class="function-signature">
                    <pre><code>void vTaskDelete(TaskHandle_t xTaskToDelete);</code></pre>
                </div>
                
                <p><strong>参数</strong>：</p>
                <ul>
                    <li>xTaskToDelete: 要删除的任务句柄，NULL表示删除当前任务</li>
                </ul>
                
                <p><strong>作用</strong>：删除指定的任务</p>
                
                <p><strong>示例</strong>：</p>
                <pre><code>// 删除其他任务
vTaskDelete(xOtherTaskHandle);

// 删除当前任务（自杀）
void vSuicideTask(void *pvParameters) {
    // 执行一些操作
    // ...
    
    // 删除自身
    vTaskDelete(NULL);
}</code></pre>
            </section>
            
            <div class="nav-links">
                <a href="chapter1.html">上一章：基础知识</a>
                <a href="chapter3.html">下一章：任务调度</a>
            </div>
        </div>
    </div>

    <footer class="footer">
        <p>FreeRTOS学习笔记 &copy; 2025</p>
        <p>作者: zou.commit()</p>
    </footer>
</body>
</html>